package socket.Serveur;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    // La liste des informations contenues par le serveur.
    private LinkedHashMap<String, String> infos;

    // Quand on construit le serveur, on initialise les informations.
    public Server() {
        this.infos = new LinkedHashMap<String, String>();
        this.initialize();
    }

    // Initialisation du tableau.
    private void initialize() {
        this.infos.put("Bidule","Duponchelle");
        this.infos.put("Machin", "Oliva");
        this.infos.put("Truc", "Jeddi");
        this.infos.put("Chose", "Mnémoi");
        this.infos.put("Boulet", "Jeddi");
        this.infos.put("Gros boulet", "Jeddi");
    }

    /**
     * Services :
     * Ajout.
     * Listage.
     **/

    // Ajouter :
    public String addInfo(String nom, String surnom) {
        return this.infos.put(surnom, nom);
    }

    // Lister :
    public LinkedHashMap<String, String >getInfos() {
        return this.infos;
    }
    
    public void run() {
        ServerSocket surnomServer = null;
        String line;
        BufferedReader is;
        PrintStream os;
        Socket clientSocket = null;
        try {
            surnomServer = new ServerSocket(2345);
        } catch (IOException e) {
            System.out.println(e);
        }

        while (true) {
            try {
                clientSocket = surnomServer.accept();
                is = new BufferedReader(new InputStreamReader(clientSocket
                        .getInputStream()));
                os = new PrintStream(clientSocket.getOutputStream());
                boolean connection = true;


                os.println("Voici les commandes disponibles : \n");
                os
                        .println("Ajouter une association nom/surnom  :  ADD_<surnom>_<nom>");
                os
                        .println("Supprimer une association nom/surnom : DEL_<surnom>");
                os
                        .println("Modifier un surnom : MODS_<ancien surnom>_<nouveau surnom>");
                os
                        .println("Modifier le nom associé à un surnom : MODN_<surnom>_<nom>");
                os
                        .println("Lister toutes les associations nom/surnom : LISTALL");
                os
                        .println("Lister tous les surnoms associés à un nom : LIST_<nom>");
                os.println("Quitter : QUIT");
                os.println("STOP");

                while ((line = is.readLine()) != null && connection) {
                    String[] tabStr = line.split("_");
                    Services value;
                    try {
                        value = Services.valueOf(tabStr[0]);
                    } catch (Exception e) {
                        value = Services.ERROR;
                    }
                    switch (value) {
                    case ADD:
                        String old = this.addInfo(tabStr[1], tabStr[2]);
                        if(old == null) {
                            os.println("OK");
                        } else {
                            os.println("ERROR_02 : le surnom existe déjà.");
                            this.addInfo(tabStr[1], old);
                        }
                        os.println("STOP");
                        break;
                    case LIST:
                        os.println("ERROR : requête non implémentée.");
                        os.println("STOP");
                        break;
                    case LISTALL:       
                        os.println("OK");
                        Iterator<String> i = this.infos.keySet().iterator();
                        String cle = null, associe = null;
                        while(i.hasNext()) {
                            cle = (String)(i.next());
                            associe = this.infos.get(cle);
                            os.println("Surnom : " + cle + ", Nom : " + associe);
                        }
                        os.println("STOP");
                        break;
                    case QUIT:
                        os.println("QUIT");
                        connection = false;
                        break;
                    case MODN:
                        os.println("ERROR : requête non implémentée.");
                        os.println("STOP");
                        break;
                    case MODS:
                        os.println("ERROR : requête non implémentée.");
                        os.println("STOP");
                        break;
                    case DEL:
                        os.println("ERROR : requête non implémentée.");
                        os.println("STOP");
                        break;
                    default:
                        os.println("ERROR : requête inconnue.");
                        os.println("STOP");
                        break;

                    }
                }

            } catch (IOException e) {
                System.out.println(e);
            }
        }
    }

    public static void main(String args[]) {
        Server s = new Server();
        s.run();
    }

}